// 单例模式 ———俄汉模式 在定义的时候就初始化了一个对象
#include <iostream>
using namespace std;
// class signal
// {
// private:
//     static signal _once;
//     signal() // 构造函数私有化
//         : data(99)
//     {
//         cout << "创建了一个单例对象" << endl;
//     }
//     signal(signal &s) = delete; // 删除拷贝构造
//     ~signal() {};
//     int data;

// public:
//     static signal &getonce()
//     {
//         return _once;
//     }
//     int getdata()
//     {
//         return data;
//     }
// };
// signal signal::_once;//这里是初始化对象和实例化出对象
// 静态成员变量和静态成员函数可以突破类域访问，然后调用siganl的构造函数初始化对象
// int main()
// {
//     cout<<signal::getonce().getdata()<<endl;
//     //signal::_once;虽然静态成员函数可以突破类域访问，但是也受到访问限定符的限制，所以这里会报错，如果_once为public就可以访问
// }

// 单例模式 ———懒汉模式 在用的时候才实例话
// c++11之后有一个新的特性，当多个线程试图初始化一个静态局部变量的时候，只初始化一次

class signal
{
private:
    signal() // 构造函数私有化
        : data(99)
    {
        cout << "创建了一个单例对象" << endl;
    }
    signal(signal &s) = delete; // 删除拷贝构造
    ~signal() {};
    int data;

public:

    static signal &getonce()
    {
    // 生命周期从第一次调用开始，到程序结束
        static signal _once;
        return _once;
    }
    int getdata()
    {
        return data;
    }
};
int main()
{
    cout<<signal::getonce().getdata()<<endl;
    //signal::_once;虽然静态成员函数可以突破类域访问，但是也受到访问限定符的限制，所以这里会报错，如果_once为public就可以访问
}
